单链表是否有环(Java版)

本文介绍了如何使用Java判断单链表是否存在环,并详细阐述了判断过程。通过设置快慢指针,当快指针追上慢指针时确定链表有环。此外,文章还探讨了如何找到环的入口节点,以及如何求环的长度。
摘要由CSDN通过智能技术生成
题目:判断一个带头结点的单链表L是否有环

解题思路:
咋看之下,这题还真不好解,于是又一些投机取巧的人,在访问单链表中元素的时候,用一个比较大的数N控制访问元素的个数,他们认为如果在访问到第N个元素之前有一个元素为null,那么单链表没有环,反之,单链表有环。他们的解释是都访问了这么多元素了,还没有一个元素为空,单链表很有可能有环,再加上一般单链表中的元素都不超过N个,所以单链表有环。对于这种解答方式,我们也只能呵呵了。

要判断单链表有没有环,肯定会判断两个指针是否相等。而且这两个指针从头结点位置开始走的步数肯定不一样。可以设两个指针slow,fast,slow从头结点开始往后走,每次走一步,同时fast从头结点开始往后走,每次走两步,这两个指针一直往后面走直到fast为空,则单链表无环,或者slow与fast相等,则单链表有环。这个过程可以保证slow会走过所有在它之前的结点,同时fast比slow多走的步长从1开始每次递增1,而且当它们相遇时多走的步长就是环中结点的个数的正整数倍。


好的,我了解您的要求。关于您的问题,Java可以实现循单链表和约瑟夫。循单链表是一种特殊的单向链表,它的尾节点指向头节点,形成一个。它的节点包含数据和指向下一个节点的指针。约瑟夫是一个数学问题,也可以用链表来实现。算法如下: 1. 构造循单链表并初始化节点数,设为 n。 2. 设定一个指针,指向头节点。 3. 从头节点开始遍历,每 m 个节点删除一个节点,直到链表只剩一个节点。 4. 输出最后剩下的节点。 Java代码实现如下: //定义节点类 class ListNode { int val; ListNode next; public ListNode(int val) { this.val = val; this.next = null; } } //循单链表类 class CircularLinkedList { private ListNode head; //头节点 private ListNode tail; //尾节点 private int size; //节点数 public CircularLinkedList() { this.head = null; this.tail = null; this.size = 0; } //添加节点 public void addNode(int val) { ListNode node = new ListNode(val); if (head == null) { head = node; tail = node; tail.next = head; } else { tail.next = node; tail = node; tail.next = head; } size++; } //约瑟夫 public int josephus(int m) { if (size == 0) return -1; //链表为空 ListNode cur = head; while (size > 1) { for (int i = 1; i < m - 1; ++i) { cur = cur.next; } cur.next = cur.next.next; //删除第 m 个节点 size--; cur = cur.next; //指向下一个节点 } return cur.val; } } //测试代码 public class Main { public static void main(String[] args) { CircularLinkedList cll = new CircularLinkedList(); for (int i = 1; i <= 10; ++i) { cll.addNode(i); } System.out.println(cll.josephus(3)); //输出最后剩下的节点 } } 以上就是Java实现循单链表和约瑟夫的代码。希望能够帮到您。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值